// CPU klockad till 8MHz #define F_CPU 8000000 UL #include #include #include #include #include #include extern void bluebaby(); extern void greenbaby(); extern void nollbaby(); extern void ret(); // Metoder från Board.c extern void playMove(int plats); extern void winAnimation(char vinnare); extern void switchTur(); extern void resetBoard(); extern void init(); extern void playAIMove(); extern char checkWin(int board[9]); extern int convertFromCase(int n); extern bool checkMove(int drag); // Anger vems tur det är. 1 = blå, 2 = grön (Eller röd hmmm) int tur = 1; // Vektor som håller positioner i brädet. 0 = tom, 1 = blå, 2 = grön int board[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; // 0 = human, 1 = easy bot, 2 = mellan bot, 3 = hard/miniMax int grad = 0; // keypad bestämmer vad som kommer göras i kommande switch-sats. Sätts till w/e, så länge det inte är mellan 0 & 15 int keypad = 100; // Bestämmer om boten ska göra ett drag eller om det är spelarens tur // knappsats ordning | pixlar ordning // 13 12 14 15 | 1 2 3 // 9 8 10 11 | 4 5 6 10 // 5 4 6 7 | 7 8 9 // 1 0 2 3 | // P1: DDRD=0b01000000, P2: DDRD=0b00100000, P3: DDRD=0b00010000, P4: DDRD=0b00001000, P5: DDRD=0b00000100, // P6: DDRD=0b00000010, P7: DDRD=0b00000001, P8: DDRB= 0b00000001, P9: DDRB=0b00000010, P10: DRRB=0b00000100 // Main-metod följer int main(void) { // Initierar pinsen init(); DDRD = 0b00000000; DDRB = 0b00000100; bluebaby(); // Spel körs medan strömmen är igång while (1) { // Om PINA har fått in en ny input som inte stämmer överens med gamla värdet så hanteras inputen if (PINA != keypad) { // keypad sätts till PIN A, så att if-satsen inte aktiveras förrän nytt värde på PIN A uppstår keypad = PINA; // Switch-sats som kommer att göra något beroende på vilken knapp som tryckts ner. switch (keypad) { // knappar 4, 6, 7, 8, 10, 11, 12, 14, 15 är olika dragen, // där värde 12 representerar knapp 0, 14 = 1, 15 = 2, 8 = 3, 10 = 4, 11 = 5, 4 = 6, 6 = 7 och 7 = 8 // Detta gör vi för att det ska vara så förvirrande som möjligt case 4: case 6: case 7: case 8: case 10: case 11: case 12: case 14: case 15: // Jag kommer att referera till värden som "case-värden" & "vektor-värden" framöver, där case-värdet är det talet som keypaden ger ifrån sig, och vektor-värdet är det som placeras i vektorn. Pga att de är olika kommer konvertering mellan dessa att uppstå, och det är bra att ha i åtanke varför detta görs. // Nedanför skickas case-värdet till playMove(), för att sedan byta tur. if (checkMove(convertFromCase(keypad))) { playMove(keypad); switchTur(); // Om svårighetsgraden inte är pvp ska boten göra ett drag. Detta sker först med en delay. if (grad != 0) { _delay_ms(1000); playAIMove(); } } break; case 3: // RESET resetBoard(); DDRD = 0b00000000; DDRB = 0b00000100; nollbaby(); bluebaby(); tur = 1; grad = 0; break; case 13: // pvp grad = 0; break; case 9: // easy svarighet grad = 1; playAIMove(); break; case 5: // normal svarighet grad = 2; playAIMove(); break; case 1: // hard svarighet grad = 3; playAIMove(); break; } } } }